package com.qq.API_日期与时间.JDK8;

import java.text.SimpleDateFormat;
import java.time.Clock;
import java.time.LocalDateTime;
import java.time.ZoneId;

//DateTimeFormatter
//在JDK8中引入了一个全新的日期与时间格式器DateTimeFormatter，等同于SimpleDateFormat
//与SimpleDateFormat区别：
//1.正反都能调用format方法2.不能解析时间毫秒值3.创建对象必须有参4.调用parse不用抛异常
//5.解析对象时，如果调用解析器的parse方法，返回的是TemporalAccessor类型(所有日期时间对象的父类)，具体类型要强转

//创建对象：
//public static DateTimeFormatter ofPattern (String s) 		调用静态方法创建指定格式的解析/格式化器对象
//方法：
//public String format(TemporalAccessor T)					格式化日期时间对象
//public TemporalAccessor parse(CharSequence text)			解析文本，并返回 TemporalAccessor类型(所有日期时间对象的父类)	

import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;//其实是所有日期时间对象的共同接口
import java.util.Date;
public class API_DateTimeFormat {
    public static void main(String[] args) {
        // 创建此刻日期时间对象
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);

        // 创建解析/格式化器
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
        // 正向格式化
        System.out.println(dtf.format(ldt));//创建格式化对象后调用自己的format方法，传需要格式化的日期时间对象
        // 逆向格式化
        System.out.println(ldt.format(dtf));//日期时间对象本身也有format方法，调用后把格式化器对象传来

        // 解析字符串时间
        String a = "2019-12-11 11:11:11" ;//只能解析和指定格式一样格式的时间字符串,否则报错！！
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        
        //调用解析器的parse方法解析字符串，会返回 TemporalAccessor类型(所有日期时间对象的父类)，因为要兼容所有日期时间对象
//        LocalDateTime ldt0 =  (LocalDateTime) dtf1.parse(a);
//        System.out.println(ldt0);
        
        //调用日期时间对象的parse方法，参数为字符串和解析器对象，返回对应日期时间对象类型
        LocalDateTime ldt1 = LocalDateTime.parse(a,dtf1);//不会报编译时异常，和SimpleDateFormat的parse不一样
        System.out.println(ldt1);
        System.out.println(ldt1.getDayOfYear());
        
        //DateTimeFormat与SimpleDateFormat的区别：
        //DateTimeFormat解析字符串，字符串的格式必须和设定的格式一模一样，位数不能有差别，日期格式也要正确
        //SimpleDateFormat解析字符串，字符串的格式没那么严谨，"2019-13-11 11:11:11" "2019-1222-11 11:11:11"，都不会报错
        //DateTimeFormat对象传入parse方法不会报编译时异常
        //SimpleDateFormat使用parse方法会报编译时异常
        
    }
}
